Spring Security এ Custom Filter তৈরি করার মাধ্যমে আপনি সিকিউরিটি চেক বা কাস্টম প্রক্রিয়াগুলি আপনার ওয়েব অ্যাপ্লিকেশনে সংযোজন করতে পারেন। Spring Security বিভিন্ন ফিল্টার ব্যবহার করে HTTP রিকোয়েস্টের নিরাপত্তা নিশ্চিত করে, এবং আপনি আপনার প্রয়োজনে একটি কাস্টম ফিল্টার তৈরি করতে পারেন যা নির্দিষ্ট রিকোয়েস্টের জন্য নিরাপত্তা যাচাই বা অন্যান্য কাজ সম্পাদন করবে।
ফিল্টারগুলি সাধারণত Filter Chain এ একের পর এক চলে এবং রিকোয়েস্ট প্রক্রেস করার জন্য বিভিন্ন কাজ সম্পন্ন করে।
Custom Filter তৈরির ধাপসমূহ
1. Filter Interface Implement করা
স্প্রিং সিকিউরিটিতে কাস্টম ফিল্টার তৈরি করতে হলে javax.servlet.Filter বা org.springframework.web.filter.GenericFilterBean ইন্টারফেস ইমপ্লিমেন্ট করতে হবে। সাধারনত, GenericFilterBean ব্যবহার করা হয় কারণ এটি স্প্রিং-এর কনটেক্সটের সাথে ভালোভাবে কাজ করে।
2. FilterBean কনফিগার করা
এই ফিল্টারটি স্প্রিং সিকিউরিটি কনফিগারেশনের অংশ হিসেবে যুক্ত করতে হবে।
Custom Filter তৈরি করার উদাহরণ
ধরা যাক, আমরা একটি কাস্টম ফিল্টার তৈরি করতে চাই যা প্রতিটি রিকোয়েস্টে একটি কাস্টম হেডার চেক করবে এবং যদি এটি না থাকে, তবে রিকোয়েস্টটি ব্লক করবে।
1. Custom Filter তৈরি করা
প্রথমে, একটি কাস্টম ফিল্টার তৈরি করি যা চেক করবে যে রিকোয়েস্টে একটি নির্দিষ্ট হেডার আছে কি না। যদি না থাকে, তবে 403 Forbidden রেসপন্স ফিরিয়ে দিবে।
import org.springframework.web.filter.GenericFilterBean;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CustomHeaderFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
// চেক করুন হেডারে একটি নির্দিষ্ট ভ্যালু আছে কি না
String header = httpRequest.getHeader("X-Custom-Header");
if (header == null || !header.equals("expectedValue")) {
// যদি হেডারটি নেই বা সঠিক না হয়, তাহলে 403 ফিরিয়ে দিন
httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "Forbidden: Invalid Header");
return;
}
// যদি হেডার সঠিক থাকে, তাহলে চেইন চালিয়ে যান
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// Custom filter initialization (if needed)
}
@Override
public void destroy() {
// Cleanup if needed
}
}
2. Custom Filter Spring Security Configurations এ রেজিস্টার করা
এখন আমাদের এই কাস্টম ফিল্টারটি Spring Security কনফিগারেশনে রেজিস্টার করতে হবে যাতে এটি রিকোয়েস্ট প্রক্রেসিংয়ের অংশ হিসেবে কাজ করে।
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// কাস্টম ফিল্টারটি স্প্রিং সিকিউরিটি ফিল্টার চেইনে যুক্ত করুন
http.addFilterBefore(new CustomHeaderFilter(), UsernamePasswordAuthenticationFilter.class)
.authorizeRequests()
.antMatchers("/public/**").permitAll() // Public URL access
.anyRequest().authenticated() // All other URLs need authentication
.and()
.formLogin() // Enable form-based login
.and()
.logout(); // Enable logout functionality
}
}
এখানে addFilterBefore মেথডটি ব্যবহার করা হয়েছে যা কাস্টম ফিল্টারটি UsernamePasswordAuthenticationFilter এর আগে সিকিউরিটি ফিল্টার চেইনে যুক্ত করবে। আপনি চাইলে addFilterAfter ব্যবহার করতে পারেন যাতে এটি অন্য কোনো ফিল্টারের পরে চলে।
3. FilterChainConfigurer - ফিল্টারের অর্ডার এবং কাস্টম কনফিগারেশন
যদি আপনার অ্যাপ্লিকেশনটিতে একাধিক কাস্টম ফিল্টার থাকে, তবে সেগুলোর কাজের অর্ডার নির্ধারণ করা খুবই গুরুত্বপূর্ণ। আপনি চাইলে ফিল্টারগুলির মধ্যে একটি নির্দিষ্ট অর্ডারও সেট করতে পারেন।
http.addFilterBefore(new CustomFilterOne(), UsernamePasswordAuthenticationFilter.class);
http.addFilterAfter(new CustomFilterTwo(), CustomFilterOne.class);
এখানে, CustomFilterOne প্রথমে চলে এবং তারপর CustomFilterTwo চলে।
4. Filter Bean Lifecycle
যতটা সম্ভব ফিল্টারের জীবনচক্র (Lifecycle) স্পষ্টভাবে ব্যাখ্যা করা উচিত, কারণ Spring এর GenericFilterBean ক্লাসে init() এবং destroy() মেথড থাকে, যা আপনি ফিল্টারের ইনিশিয়ালাইজেশন এবং ক্লিনআপের জন্য ব্যবহার করতে পারেন।
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// Filter initialization logic
}
@Override
public void destroy() {
// Filter cleanup logic
}
5. কাস্টম ফিল্টারের নিরাপত্তা ভূমিকা
Spring Security ফিল্টার চেইনে কাস্টম ফিল্টার যোগ করার মাধ্যমে আপনি:
- এনক্রিপশন চেক: রিকোয়েস্টের ডেটা সুরক্ষিত কিনা তা যাচাই করতে পারেন।
- অনুমতি যাচাই: বিশেষ রোল বা অনুমতি যাচাই করার জন্য কাস্টম লজিক প্রয়োগ করতে পারেন।
- লগিং এবং মনিটরিং: কাস্টম ফিল্টার দিয়ে রিকোয়েস্ট লগ বা মনিটর করতে পারেন।
- ক্রস-সাইট স্ক্রিপ্টিং (XSS) প্রতিরোধ: স্পষ্টভাবে স্ক্রিপ্ট ইনপুট ফিল্টারিং করতে পারেন।
উপসংহার
স্প্রিং সিকিউরিটির কাস্টম ফিল্টার তৈরি করার মাধ্যমে আপনি নিরাপত্তা সম্পর্কিত বিভিন্ন কাস্টম চেক বা লজিক অ্যাপ্লিকেশনে প্রয়োগ করতে পারেন। এটি স্প্রিং সিকিউরিটির ফিল্টার চেইনে আপনার নির্দিষ্ট নিরাপত্তা নীতি বা অন্যান্য ফিচার যোগ করার জন্য একটি শক্তিশালী মাধ্যম।
Read more